library packages
rm (list = ls ())
library (ggplot2)
library (dplyr)
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
library (colorspace)
library (stringr)
library (geojsonsf)
library (sf)
Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1; sf_use_s2() is TRUE
Map Korea
load .json
kor_sigu <- geojson_sf ("https://raw.githubusercontent.com/Sungileo/trainsets/main/kor/KOR_SIGU.json" )
Warning in readLines(con):
'https://raw.githubusercontent.com/Sungileo/trainsets/main/kor/KOR_SIGU.json'에서
불완전한 마지막 행이 발견되었습니다
kor_202202 <- read.csv ("https://raw.githubusercontent.com/Sungileo/trainsets/main/202202_%EC%A3%BC%EB%AF%BC%EB%93%B1%EB%A1%9D%EC%9D%B8%EA%B5%AC%EB%B0%8F%EC%84%B8%EB%8C%80%ED%98%84%ED%99%A9.csv" )
kor_202202 %>% head ()
행정구역 행정구역_코드 총인구수 세대수 세대당_인구 남자_인구수
1 서울특별시 1100000000 9508451 4442586 2.14 4615823
2 서울특별시 종로구 1111000000 144575 73763 1.96 70092
3 서울특별시 중구 1114000000 122167 63644 1.92 59446
4 서울특별시 용산구 1117000000 222413 111134 2.00 106881
5 서울특별시 성동구 1120000000 285137 134286 2.12 138866
6 서울특별시 광진구 1121500000 340494 168975 2.02 164226
여자_인구수 남여_비율
1 4892628 0.94
2 74483 0.94
3 62721 0.95
4 115532 0.93
5 146271 0.95
6 176268 0.93
kor_202202 %>% sapply (class)
행정구역 행정구역_코드 총인구수 세대수 세대당_인구
"character" "numeric" "numeric" "numeric" "numeric"
남자_인구수 여자_인구수 남여_비율
"numeric" "numeric" "numeric"
kor_202202$ 행정구역_코드 <- kor_202202$ 행정구역_코드 %>% format ()
Merge data by 행정구역_코드
use_map <- kor_sigu
use_map$ 행정구역_코드 <- paste (use_map$ SIG_CD,"00000" ,sep = "" )
use_map <- use_map %>% merge (kor_202202,by = "행정구역_코드" , all.x= T)
Plot
use_map %>% ggplot (aes (fill= 총인구수))+
geom_sf (color = "grey90" )+
coord_sf (datum = NA )+
scale_fill_distiller (
name = "인구수" ,
palette = "Blues" , type = "seq" , na.value = "grey60" ,
direction = 1 ,
breaks = seq (0 ,10 ,2 ) * 1e+5 ,
labels = format (seq (0 ,10 ,2 ) * 1e+5 , big.mark = "," ,scientific = FALSE ))+
theme_minimal ()+
theme (
legend.title.align = 0.5 ,
legend.text.align = 1.0 ,
legend.position = c (0.85 ,0.2 )
)
Plot Daejeon
daejeon_map <- use_map %>% filter (행정구역 %>% substr (1 ,5 ) == "대전광역시" )
daejeon_map %>% ggplot (aes (fill= 총인구수))+
geom_sf (color = "grey90" )+
coord_sf (datum = NA )+
scale_fill_distiller (
name = "인구수" ,
palette = "Blues" , type = "seq" , na.value = "grey60" ,
direction = 1 ,
breaks = seq (0 ,10 ,2 ) * 1e+5 ,
labels = format (seq (0 ,10 ,2 ) * 1e+5 , big.mark = "," ,scientific = FALSE ))+
theme_minimal ()+
theme (
legend.title.align = 0.5 ,
legend.text.align = 1.0 ,
legend.position = c (0.95 ,0.2 )
)
Plot Gender_ratio
use_map %>% ggplot (aes (fill = 남여_비율))+
geom_sf ()+
scale_fill_continuous_diverging (
name = "남자/여자" ,
palette = "BLue-Red" ,
mid= 1 ,
limits = 1 + c (- 1 ,+ 1 )* 0.35 ,
rev = T)+
theme_minimal ()+
theme (
legend.title.align = 0.5 ,
legend.text.align = 1.0 ,
legend.position = c (0.85 ,0.2 )
)
2023년 3월 시군구 인구수
시군구 지도 데이터, 행정구역 코드 10자리로 만들기
use_map <- kor_sigu
use_map$ 행정구역_코드 <- paste (use_map$ SIG_CD,"00000" ,sep = "" )
데이터 로드
2023년 3월 주민등록 인구통계 데이터, 행정안전부
data_pop <- read.csv ("https://raw.githubusercontent.com/Sungileo/trainsets/main/202303_202303_%EC%A3%BC%EB%AF%BC%EB%93%B1%EB%A1%9D%EC%9D%B8%EA%B5%AC%EB%B0%8F%EC%84%B8%EB%8C%80%ED%98%84%ED%99%A9_%EC%9B%94%EA%B0%84.csv" ,encoding = "utf-8" )
data_pop %>% head ()
행정구역 X2023년03월_총인구수 X2023년03월_세대수
1 서울특별시 (1100000000) 9,426,404 4,463,385
2 서울특별시 종로구 (1111000000) 141,060 72,679
3 서울특별시 중구 (1114000000) 120,963 63,862
4 서울특별시 용산구 (1117000000) 217,756 109,735
5 서울특별시 성동구 (1120000000) 280,240 133,513
6 서울특별시 광진구 (1121500000) 336,801 169,787
X2023년03월_세대당.인구 X2023년03월_남자.인구수 X2023년03월_여자.인구수
1 2.11 4,566,299 4,860,105
2 1.94 68,170 72,890
3 1.89 58,699 62,264
4 1.98 104,640 113,116
5 2.10 136,233 144,007
6 1.98 162,209 174,592
X2023년03월_남여.비율
1 0.94
2 0.94
3 0.94
4 0.93
5 0.95
6 0.93
전처리
인구수0명 출장소 제외
행정구역 코드 10자리 추출
인구수 숫자형으로 변환
시 단위 제외, 정렬
data_202303 <- data_pop %>%
filter (X2023년03월_총인구수> 0 ) %>%
select (행정구역,X2023년03월_총인구수) %>%
mutate (행정구역_코드 = str_sub (행정구역,- 11 ,- 2 ),
X2023년03월_총인구수 = gsub ("," ,"" ,X2023년03월_총인구수) %>% as.numeric ()) %>%
filter (substr (행정구역_코드,3 ,4 )!= "00" ) %>%
arrange (desc (X2023년03월_총인구수))
data_202303 %>% head ()
행정구역 X2023년03월_총인구수 행정구역_코드
1 경기도 수원시 (4111000000) 1192225 4111000000
2 경기도 고양시 (4128000000) 1077909 4128000000
3 경기도 용인시 (4146000000) 1073513 4146000000
4 경상남도 창원시 (4812000000) 1017273 4812000000
5 경기도 성남시 (4113000000) 923416 4113000000
6 경기도 화성시 (4159000000) 922231 4159000000
지도 데이터와 병합
use_map <- use_map %>% merge (data_202303,by = "행정구역_코드" , all.x= T)
Plot
use_map %>% ggplot (aes (fill= X2023년03월_총인구수))+
geom_sf (color = "grey90" )+
coord_sf (datum = NA )+
scale_fill_distiller (
name = "2023년 3월 인구수" ,
palette = "Blues" , type = "seq" , na.value = "grey60" ,
direction = 1 ,
breaks = seq (0 ,10 ,2 ) * 1e+5 ,
labels = format (seq (0 ,10 ,2 ) * 1e+5 , big.mark = "," ,scientific = FALSE ))+
theme_minimal ()+
theme (
legend.title.align = 0.5 ,
legend.text.align = 1.0 ,
legend.position = c (0.85 ,0.2 ))+
labs (title = "2023년 3월" )
인구수 증가율
file_2023 <- read.csv ("https://raw.githubusercontent.com/Sungileo/trainsets/main/202303_202303_%EC%A3%BC%EB%AF%BC%EB%93%B1%EB%A1%9D%EC%9D%B8%EA%B5%AC%EB%B0%8F%EC%84%B8%EB%8C%80%ED%98%84%ED%99%A9_%EC%9B%94%EA%B0%84.csv" ,encoding = "utf-8" )
file_2013 <- read.csv ("https://raw.githubusercontent.com/Sungileo/trainsets/main/201303_201303_%EC%A3%BC%EB%AF%BC%EB%93%B1%EB%A1%9D%EC%9D%B8%EA%B5%AC%EB%B0%8F%EC%84%B8%EB%8C%80%ED%98%84%ED%99%A9_%EC%9B%94%EA%B0%84.csv" ,encoding = "UTF-8" )
전처리
인구수 0명 이상 필터
행정구역(지역코드), 총인구수 열만 선택
행정구역(지역코드)에서 지역코드와 행정구역 분리
시 단위 제외, 인구수 기준 정렬
data_2023 <- file_2023 %>%
filter (X2023년03월_총인구수> 0 ) %>%
select (행정구역,X2023년03월_총인구수) %>%
mutate (행정구역_코드 = str_sub (행정구역,- 11 ,- 2 ),
X2023년03월_총인구수 = gsub ("," ,"" ,X2023년03월_총인구수) %>% as.numeric (),
행정구역 = sapply (행정구역, function (x) strsplit (x, "(" , fixed= T)[[1 ]][1 ]),
행정구역 = sapply (행정구역, function (x) gsub ("( *)$" , "" , x) %>% paste ())) %>%
filter (substr (행정구역_코드,3 ,4 )!= "00" ) %>%
arrange (desc (X2023년03월_총인구수))
data_2013 <- file_2013 %>%
filter (X2013년03월_총인구수> 0 ) %>%
select (행정구역,X2013년03월_총인구수) %>%
mutate (행정구역_코드 = str_sub (행정구역,- 11 ,- 2 ),
X2013년03월_총인구수 = gsub ("," ,"" ,X2013년03월_총인구수) %>% as.numeric (),
행정구역 = sapply (행정구역, function (x) strsplit (x, "(" , fixed= T)[[1 ]][1 ]),
행정구역 = sapply (행정구역, function (x) gsub ("( *)$" , "" , x) %>% paste ())) %>%
filter (substr (행정구역_코드,3 ,4 )!= "00" ) %>%
arrange (desc (X2013년03월_총인구수))
병합
지역코드 기준 병합
인구성장률 열 추가
중복 열 제거, 인구성장률 기준 정렬
서울, 대전, 대구, 부산지역만 필터
시도 추출, factor 변환
kor_census <- data_2013 %>%
merge (data_2023,by = "행정구역_코드" , all.x= T) %>%
mutate (성장률 = (X2023년03월_총인구수 - X2013년03월_총인구수) / X2013년03월_총인구수) %>%
select (행정구역.x,X2013년03월_총인구수,X2023년03월_총인구수, 성장률, 행정구역_코드) %>%
filter (substr (행정구역.x,1 ,2 ) %in% c ("서울" ,"대전" ,"대구" ,"부산" )) %>%
arrange (desc (성장률))
names (kor_census) <- c ("행정구역" , "X2013인구수" ,"X2023인구수" ,"성장률" ,"행정구역_코드" )
kor_census$ 시도 = sapply (kor_census$ 행정구역,
function (x) strsplit (x, " " )[[1 ]][1 ])
kor_census$ 시도 = factor (kor_census$ 시도,
levels = c ("서울특별시" ,"대전광역시" ,"대구광역시" ,"부산광역시" ))
Plot
region_colors <- c ("#E69F00" ,"#56B4E9" ,"#009E73" ,"#F0E442" )
ggplot (kor_census,aes (x = reorder (행정구역,성장률),y= 성장률, fill = 시도))+
geom_col ()+
scale_y_continuous (name = "인구성장률" ,
expand = c (0 ,0 ),
labels = scales:: percent_format (scale = 100 ))+
scale_fill_manual (values = region_colors)+
coord_flip ()+
theme_light ()+
theme (panel.border = element_blank (),
panel.grid.major.y = element_blank ())+
theme (axis.title.y = element_blank (),
axis.line.y = element_blank (),
axis.ticks.length = unit (0 ,"pt" ),
axis.text.y = element_text (size = 8 ),legend.position = c (.78 ,.28 ),legend.background = element_rect (fill = "#FFFFFFB0" ))
Map plot
kor_map <- kor_sigu
kor_map$ 행정구역_코드 <- paste (kor_map$ SIG_CD,"00000" ,sep= "" )
kor_census_2 <- data_2013 %>%
merge (data_2023,by = "행정구역_코드" , all.x= T) %>%
mutate (성장률 = (X2023년03월_총인구수 - X2013년03월_총인구수) / X2013년03월_총인구수) %>%
select (행정구역.x,X2013년03월_총인구수,X2023년03월_총인구수, 성장률, 행정구역_코드) %>%
arrange (desc (성장률))
names (kor_census_2) <- c ("행정구역" , "X2013인구수" ,"X2023인구수" ,"성장률" ,"행정구역_코드" )
kor_map <- kor_map %>% left_join (kor_census_2, by= "행정구역_코드" )
kor_map %>% ggplot (aes (fill= 성장률))+
geom_sf ()+
scale_fill_continuous_diverging (
name = "인구성장률" ,
palette = "BLue-Red" ,
limits = c (- 0.4 ,2.4 ))+
theme_minimal ()+
theme (legend.title.align = 0.5 ,
legend.text.align = 1.0 ,
legend.position = c (0.85 ,0.2 ))
인구증감
data <- read.csv ("https://raw.githubusercontent.com/Sungileo/trainsets/main/kor_census_2013_2023.csv" ,encoding = "utf-8" )
data <- data %>% mutate (인구증감 = 총인구수_2023- 총인구수_2013)
use_map <- kor_sigu
use_map$ 행정구역_코드 <- paste (use_map$ SIG_CD,"00000" ,sep = "" ) %>% as.numeric ()
use_map <- use_map %>% merge (data,by = "행정구역_코드" )
use_map %>% ggplot (aes (fill = 인구증감))+
geom_sf ()+
coord_sf (datum = NA )+
scale_fill_continuous_diverging (
name = "인구증감" ,
palette = "BLue-Red" ,
na.value = "grey40" ,
mid= 0 ,
rev = T,
limits = c (- 4 ,4 )* 100000 ,
labels = format (seq (- 4 ,4 ,2 ) * 1e+5 , big.mark = "," ,scientific = FALSE ))+
theme_minimal ()+
theme (legend.position = c (0.85 ,0.2 ))
Mapdeck
library (dplyr)
library (mapdeck)
set_token ("pk.eyJ1Ijoic3VuZ2lsZW8iLCJhIjoiY2xoYTRwbXEzMGR6eTNkbXBoZnluNXdyYSJ9.Id1fKIbhtvA9Mrnyo_1JQA" )
crash_data = read.csv ("https://git.io/geocompr-mapdeck" )
crash_data = na.omit (crash_data)
ms = mapdeck_style ("dark" )
# mapdeck(style = "mapbox://styles/sungileo/clhtwpzyw00rl01rhfoiafw6q")
grid_map
mapdeck (style = ms,
pitch = 45 ,
location = c (0 , 52 ),
zoom = 4 ) %>%
add_grid (data = crash_data,
lat = "lat" ,
lon = "lng" ,
cell_size = 1000 ,
elevation_scale = 50 ,
layer_id = "grid_layer" ,
colour_range = viridisLite:: plasma (6 ))
Registered S3 method overwritten by 'jsonify':
method from
print.json jsonlite